cardView.tsx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. 'use client'
  2. import type { FC } from 'react'
  3. import React from 'react'
  4. import { useTranslation } from 'react-i18next'
  5. import { useContext } from 'use-context-selector'
  6. import useSWR, { useSWRConfig } from 'swr'
  7. import AppCard from '@/app/components/app/overview/appCard'
  8. import Loading from '@/app/components/base/loading'
  9. import { ToastContext } from '@/app/components/base/toast'
  10. import {
  11. fetchAppDetail,
  12. updateAppSiteAccessToken,
  13. updateAppSiteConfig,
  14. updateAppSiteStatus,
  15. } from '@/service/apps'
  16. import type { App } from '@/types/app'
  17. import type { UpdateAppSiteCodeResponse } from '@/models/app'
  18. import { asyncRunSafe } from '@/utils'
  19. import { NEED_REFRESH_APP_LIST_KEY } from '@/config'
  20. import type { IAppCardProps } from '@/app/components/app/overview/appCard'
  21. export type ICardViewProps = {
  22. appId: string
  23. }
  24. const CardView: FC<ICardViewProps> = ({ appId }) => {
  25. const detailParams = { url: '/apps', id: appId }
  26. const { data: response } = useSWR(detailParams, fetchAppDetail)
  27. const { mutate } = useSWRConfig()
  28. const { notify } = useContext(ToastContext)
  29. const { t } = useTranslation()
  30. if (!response)
  31. return <Loading />
  32. const handleCallbackResult = (err: Error | null, message?: string) => {
  33. const type = err ? 'error' : 'success'
  34. message ||= (type === 'success' ? 'modifiedSuccessfully' : 'modifiedUnsuccessfully')
  35. if (type === 'success') {
  36. mutate(detailParams)
  37. }
  38. notify({
  39. type,
  40. message: t(`common.actionMsg.${message}`),
  41. })
  42. }
  43. const onChangeSiteStatus = async (value: boolean) => {
  44. const [err] = await asyncRunSafe<App>(
  45. updateAppSiteStatus({
  46. url: `/apps/${appId}/site-enable`,
  47. body: { enable_site: value },
  48. }) as Promise<App>,
  49. )
  50. handleCallbackResult(err)
  51. }
  52. const onChangeApiStatus = async (value: boolean) => {
  53. const [err] = await asyncRunSafe<App>(
  54. updateAppSiteStatus({
  55. url: `/apps/${appId}/api-enable`,
  56. body: { enable_api: value },
  57. }) as Promise<App>,
  58. )
  59. handleCallbackResult(err)
  60. }
  61. const onSaveSiteConfig: IAppCardProps['onSaveSiteConfig'] = async (params) => {
  62. const [err] = await asyncRunSafe<App>(
  63. updateAppSiteConfig({
  64. url: `/apps/${appId}/site`,
  65. body: params,
  66. }) as Promise<App>,
  67. )
  68. if (!err)
  69. localStorage.setItem(NEED_REFRESH_APP_LIST_KEY, '1')
  70. handleCallbackResult(err)
  71. }
  72. const onGenerateCode = async () => {
  73. const [err] = await asyncRunSafe<UpdateAppSiteCodeResponse>(
  74. updateAppSiteAccessToken({
  75. url: `/apps/${appId}/site/access-token-reset`,
  76. }) as Promise<UpdateAppSiteCodeResponse>,
  77. )
  78. handleCallbackResult(err, err ? 'generatedUnsuccessfully' : 'generatedSuccessfully')
  79. }
  80. return (
  81. <div className="min-w-max grid gap-6 grid-cols-1 xl:grid-cols-2 w-full mb-6">
  82. <AppCard
  83. appInfo={response}
  84. cardType="webapp"
  85. onChangeStatus={onChangeSiteStatus}
  86. onGenerateCode={onGenerateCode}
  87. onSaveSiteConfig={onSaveSiteConfig}
  88. />
  89. <AppCard
  90. cardType="api"
  91. appInfo={response}
  92. onChangeStatus={onChangeApiStatus}
  93. />
  94. </div>
  95. )
  96. }
  97. export default CardView